其他
汽车标定技术--标定量与#pragma的趣事
目录
1. 不添加#pragma语句2. 添加#pragma语句3. 标定量只给flash空间,不给ram指定空间4. 总结
在之前不会使用overlay机制的时候,我们想要做汽车标定,标定常量编译出来的地址一般都应该是ram的地址,而且在链接文件中都会指定一段区域来存放标定量和观测量。
那么为什么要提出这样奇怪的问题呢?起因是在向客户询问标定量存放在在ram的哪个位置时,客户说不需要指定特定的段。这就有点疑惑了,在标定中明确说了,标定过程会分为两页:workingpage和referencepage;WP:可以进行数据修改的页,通常是ram段;RP:不能修改的页,通常是flash段;在ETAS的文档里更明确的表示:01
—
MCU能存放数据的地方有三处:register、rom、ram,涉及到预定义的:
.text段 :存放代码
.rodata段 :存放只读数据
.noinit段 :存放不需要初始化数据
.bss段 :存放默认初始化数据(一般为0)
.data段 :存放已初始化数据
CSTACK段 :栈
HEAP段 :堆
下面来看一些变量的例子:
属性 | 位置 | 操作 | 举例 |
宏变量 | 预编译期间被汇编进.text段; | 运行已不存在 | |
常量 | 放在.rodata段 | 程序访问在.rodata读取 | |
未初始化全局变量 | 放在.noinit段;一般在ram | 在.noinit | _no_init uint32_t ni_global_var; |
默认0初始化全局变量 | 存放在.bss段;一般放在ram | 启动时将bss清零;程序访问时在.bss段存取 | |
已初始化全局变量 | 初始化值存放在.data_init段,一般是ROM;变量本身是存在.data段,一般放在ram | 启动时将初值从.data_init段复制到.data段;程序访问时均是在.data段存取 |
注:(1)观测量是放在.bss段的
(2)标定量本身应该是放在.data段的
—
通过链接文件给标定量分别划分了ram区和flash区:
同时也给观测量划分了ram区间是:0x60015000,共4K。那么现在就看如何将标定量观测量放到指定区间了;首先看看结果:
03
—
不指定ram空间
在链接文件这样写:因为没有指定映射到ram的具体地址,所以在map文件里会出现如下现象:
在相应位置添加#pragma语句:
Copy_table函数是在mcal的coreinit函数里;
04
—
总结
从以上结果来看,如果只是给标定量确定了flash的位置和大小,而不确定ram的大小,那么编译器会直接把标定量本身以及值都会存放在指定的flash里面,并且无法映射到ram,因为没有做这个操作;所以需要给ram去指定一个区间存放变量名,把值放到flash;这样我们就能做标定操作了。往期回顾:
1.汽车标定合集
汽车标定文章合集汽车标定技术--XCP协议如何支持测量功能
硬核:汽车标定--多周期测量显示异常
2.AUTOSAR合集
AUTOSAR OS概述(一)AUTOSAR OS概述(二)
AUTOSAR文章合集
Flash模拟EEPROM原理浅析
3.汽车网络安全合集
汽车网络安全方案需求分析车载信息安全场景概述
汽车网络安全渗透测试概述
汽车网络安全文章合集
4.汽车功能安全合集